import java.util.Vector;
import java.io.FileReader;
import java.io.IOException;


%%

%type Token 
%function getSigToken
%line

%{
    public Vector <String> vectorErroresLexicos = new Vector<String>();

    /**
     *Metodo main del analizador lexico
     *@param argv[] se utiliza argv[0] para indicar el nombre del archivo
     *fuente a analizar
     */

    public static void main(String argv[]){

        ListaLigadaDoble tablaSimbolos = new ListaLigadaDoble();
        Token tokenAux = null;
        Vector<String> v = new Vector<String>();
        //Se crea al lector del archivo fuente
        FileReader lector = LectorEscritorArchivos.getLector(argv[0]);

        //Se crea un objeto del analizador lexico
        Yylex yylex = new Yylex(lector);

        do{
            try {
                tokenAux = yylex.getSigToken();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            System.out.println(tokenAux);
            if(tokenAux != null){
                v.add(tokenAux.lexema);
                if(tokenAux.tipo == 3 || tokenAux.tipo == 4){
                    tablaSimbolos.insertar(tokenAux);   
                }
            }
            

        }while(tokenAux != null);

        //Se escribe en el archivo
        LectorEscritorArchivos.escribir(v);

        //System.out.println(tablaSimbolos);
        imprimirTablaSimbolos(tablaSimbolos);

        //Se imprimen los errores lexicos
        imprimirErroresLexicos(yylex.vectorErroresLexicos);

    }

    /**
     * Metodo que imprime la tabla de simbolos
     * @param tablaSimbolos tabla de simbolos a imprimir
     */
    public static void imprimirTablaSimbolos(ListaLigadaDoble tablaSimbolos ){
        //Nodo aux = tablaSimbolos.l;
        System.out.println("--------------------------");
        System.out.println("--LEXEMA------------TIPO--");
        for(int i = 0; i < tablaSimbolos.tamano; i++){
            System.out.println("|"+tablaSimbolos.l.dato.lexema+"\t\t\t"+tablaSimbolos.l.dato.tipo+"|");
            tablaSimbolos.l = tablaSimbolos.l.ant;
        }
        System.out.println("-------------------------");
    }

    /**
     *Imprime los errores lexicos encontrados
     *@param vector con los errores lexicos encontrados
     */
    public static void imprimirErroresLexicos(Vector<String> vectorErrores){
        for (String string : vectorErrores)
            System.out.println(string);
    }
    
%}

%{
    /*
    Clases lexicas

    CLASE LEXICA    TIPO
    Enteros         1
    Flotantes       2
    int (PR)        3
    float (PR)      3
    id              4
    +               5
    -               6
    *               7
    /               8
    ;               9
    ,               10
    (               11
    )               12
    */

%}


may = [A-Z]
min = [a-z]
dig = [0-9]

%%

-?({dig}|[1-9]{dig}*) {return new Token(yytext(),1);}
-?({dig}|[1-9]{dig}*)\.{dig}+ {return new Token(yytext(),2);}
int {return new Token(yytext(),3);}
float {return new Token(yytext(),3);}
(_|{may}|{min})(_|{may}|{min}|{dig}})* {return new Token(yytext(),4);}
\+ {return new Token(yytext(),5);}
- {return new Token(yytext(),6);}
\* {return new Token(yytext(),7);}
\/ {return new Token(yytext(),8);}
; {return new Token(yytext(),9);}
, {return new Token(yytext(),10);}
\( {return new Token(yytext(),11);}
\) {return new Token(yytext(),12);}
[\n \t \r] { }
. {
    vectorErroresLexicos.add("ERROR LEXICO en la linea: "+(yyline+1)+" por ->"+yytext());
  }
